home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2001 May / may_2001.iso / intercd / root / Multimedia / ^DivX_Article / virtualdub / VirtualDub-source-1_4d / a_reduce.asm < prev    next >
Encoding:
Assembly Source File  |  2001-03-20  |  7.0 KB  |  472 lines

  1. ;    VirtualDub - Video processing and capture application
  2. ;    Copyright (C) 1998-2001 Avery Lee
  3. ;
  4. ;    This program is free software; you can redistribute it and/or modify
  5. ;    it under the terms of the GNU General Public License as published by
  6. ;    the Free Software Foundation; either version 2 of the License, or
  7. ;    (at your option) any later version.
  8. ;
  9. ;    This program is distributed in the hope that it will be useful,
  10. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ;    GNU General Public License for more details.
  13. ;
  14. ;    You should have received a copy of the GNU General Public License
  15. ;    along with this program; if not, write to the Free Software
  16. ;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18.     .586
  19.     .mmx
  20.     .model    flat
  21.     .code
  22.  
  23.     extern _MMX_enabled : byte
  24.  
  25.     public    _asm_reduceby2_32
  26.  
  27. ;asm_reduceby2_32(
  28. ;    [esp+ 4] void *dst,
  29. ;    [esp+ 8] void *src,
  30. ;    [esp+12] ulong width,
  31. ;    [esp+16] ulong height,
  32. ;    [esp+20] ulong srcstride,
  33. ;    [esp+24] ulong dststride);
  34.  
  35. _asm_reduceby2_32:
  36.     test    _MMX_enabled,1
  37.     jnz    _asm_reduceby2_32_MMX
  38.  
  39.     push    ebp
  40.     push    edi
  41.     push    esi
  42.     push    edx
  43.     push    ecx
  44.     push    ebx
  45.     push    eax
  46.  
  47.     mov    esi,[esp+ 8+28]
  48.     mov    edi,[esp+20+28]
  49.     add    edi,esi
  50.     mov    edx,[esp+ 4+28]
  51.  
  52.     mov    ebp,[esp+16+28]
  53.  
  54. rowloop:
  55.     push    ebp
  56.     mov    ebp,[esp+12+32]
  57. colloop:
  58.     push    edx
  59.  
  60.     mov    eax,[esi+ebp*8-8]
  61.     mov    ebx,[esi+ebp*8-4]
  62.     mov    ecx,eax
  63.     mov    edx,ebx
  64.  
  65.     and    eax,00ff00ffh
  66.     and    ebx,00ff00ffh
  67.     and    ecx,0000ff00h
  68.     and    edx,0000ff00h
  69.     add    eax,ebx
  70.     add    ecx,edx
  71.  
  72.     mov    ebx,[edi+ebp*8-8]
  73.     mov    edx,ebx
  74.     and    ebx,00ff00ffh
  75.     and    edx,0000ff00h
  76.     add    eax,ebx
  77.     add    ecx,edx
  78.  
  79.     mov    ebx,[edi+ebp*8-4]
  80.     mov    edx,ebx
  81.     and    ebx,00ff00ffh
  82.     and    edx,0000ff00h
  83.     add    eax,ebx
  84.     add    ecx,edx
  85.  
  86.     shr    eax,2
  87.     and    ecx,0003fc00h
  88.     shr    ecx,2
  89.     and    eax,00ff00ffh
  90.     pop    edx
  91.     or    eax,ecx
  92.  
  93.     mov    [edx+ebp*4-4],eax
  94.     dec    ebp
  95.     jne    colloop
  96.     pop    ebp
  97.  
  98.     add    esi,[esp+20+28]
  99.     add    edx,[esp+24+28]
  100.     add    edi,[esp+20+28]
  101.     add    esi,[esp+20+28]
  102.     add    edi,[esp+20+28]
  103.  
  104.     dec    ebp
  105.     jne    rowloop
  106.  
  107.     pop    eax
  108.     pop    ebx
  109.     pop    ecx
  110.     pop    edx
  111.     pop    esi
  112.     pop    edi
  113.     pop    ebp
  114.     ret
  115.  
  116. _asm_reduceby2_32_MMX:
  117.     push    ebp
  118.     push    edi
  119.     push    esi
  120.     push    edx
  121.     push    ecx
  122.     push    ebx
  123.     push    eax
  124.  
  125.     mov    esi,[esp+ 8+28]
  126.     mov    edi,[esp+20+28]
  127.     add    edi,esi
  128.     mov    edx,[esp+ 4+28]
  129.  
  130.     mov    ebp,[esp+16+28]
  131.  
  132.     pxor    mm7,mm7
  133.  
  134. rowloop_MMX:
  135.     push    ebp
  136.     mov    ebp,[esp+12+32]
  137. colloop_MMX:
  138.     movq    mm0,[esi+ebp*8-8]
  139.  
  140.     movq    mm1,[edi+ebp*8-8]
  141.     movq    mm2,mm0
  142.  
  143.     punpcklbw mm0,mm7
  144.     movq    mm3,mm1
  145.  
  146.     punpcklbw mm1,mm7
  147.  
  148.     punpckhbw mm2,mm7
  149.     paddw    mm0,mm1
  150.  
  151.     punpckhbw mm3,mm7
  152.     paddw    mm0,mm2
  153.  
  154.     paddw    mm0,mm3
  155.  
  156.     psrlw    mm0,2
  157.  
  158.     packuswb mm0,mm0
  159.     dec    ebp
  160.  
  161.     movd    [edx+ebp*4],mm0
  162.     jne    colloop_MMX
  163.  
  164.     pop    ebp
  165.  
  166.     add    esi,[esp+20+28]
  167.     add    edx,[esp+24+28]
  168.     add    edi,[esp+20+28]
  169.     add    esi,[esp+20+28]
  170.     add    edi,[esp+20+28]
  171.  
  172.     dec    ebp
  173.     jne    rowloop_MMX
  174.  
  175.     pop    eax
  176.     pop    ebx
  177.     pop    ecx
  178.     pop    edx
  179.     pop    esi
  180.     pop    edi
  181.     pop    ebp
  182.     emms
  183.     ret
  184.  
  185. ;**********************************************************
  186.  
  187.     public    _asm_reduce2hq_run
  188.  
  189. ;asm_reduce2hq_run(
  190. ;    [esp+ 4] void *dst,
  191. ;    [esp+ 8] void *src,
  192. ;    [esp+12] ulong width,
  193. ;    [esp+16] ulong height,
  194. ;    [esp+20] ulong srcstride,
  195. ;    [esp+24] ulong dststride);
  196.  
  197. _asm_reduce2hq_run:
  198.     test    _MMX_enabled, 1
  199.     jnz    _asm_reduce2hq_run_MMX
  200.  
  201.     push    ebp
  202.     push    edi
  203.     push    esi
  204.     push    edx
  205.     push    ecx
  206.     push    ebx
  207.     push    eax
  208.  
  209.     mov    esi,[esp+ 8+28]
  210.     mov    edi,[esp+20+28]
  211.     mov    edx,[esp+ 4+28]
  212.  
  213.     mov    ebp,[esp+16+28]
  214.  
  215. rowloop2:
  216.     push    ebp
  217.     mov    ebp,[esp+12+32]
  218.     mov    eax,ebp
  219.     shl    eax,3
  220.     add    esi,eax
  221. colloop2:
  222.     
  223.     ; middle center is 4x
  224.     ; top center, middle left, middle right, and bottom center are 2x
  225.     ; corners are 1x
  226.  
  227.     push    edx
  228.     mov    eax,[esi-8]        ;top center    (2x)
  229.     mov    ebx,[esi+edi+4-8]    ;middle right    (2x)
  230.     sub    esi,8
  231.     mov    ecx,eax
  232.     mov    edx,ebx
  233.  
  234.     and    eax,00ff00ffh
  235.     and    ebx,00ff00ffh
  236.     and    ecx,0000ff00h
  237.     and    edx,0000ff00h
  238.     add    eax,ebx
  239.     add    ecx,edx
  240.  
  241.     mov    ebx,[esi+edi-4]        ;middle left    (2x)
  242.     mov    edx,ebx
  243.     and    ebx,00ff00ffh
  244.     and    edx,0000ff00h
  245.     add    eax,ebx
  246.     add    ecx,edx
  247.  
  248.     mov    ebx,[esi+edi*2]        ;bottom center    (2x)
  249.     mov    edx,ebx
  250.     and    ebx,00ff00ffh
  251.     and    edx,0000ff00h
  252.     add    eax,ebx
  253.     add    ecx,edx
  254.  
  255.     add    eax,eax            ;double the ortho edges
  256.     add    ecx,ecx
  257.  
  258.     mov    ebx,[esi-4]        ;top left    (1x)
  259.     mov    edx,ebx
  260.     and    ebx,00ff00ffh
  261.     and    edx,0000ff00h
  262.     add    eax,ebx
  263.     add    ecx,edx
  264.  
  265.     mov    ebx,[esi+4]        ;top right    (1x)
  266.     mov    edx,ebx
  267.     and    ebx,00ff00ffh
  268.     and    edx,0000ff00h
  269.     add    eax,ebx
  270.     add    ecx,edx
  271.  
  272.     mov    ebx,[esi+edi*2-4]    ;bottom left    (1x)
  273.     mov    edx,ebx
  274.     and    ebx,00ff00ffh
  275.     and    edx,0000ff00h
  276.     add    eax,ebx
  277.     add    ecx,edx
  278.  
  279.     mov    ebx,[esi+edi*2+4]    ;bottom right    (1x)
  280.     mov    edx,ebx
  281.     and    ebx,00ff00ffh
  282.     and    edx,0000ff00h
  283.     add    eax,ebx
  284.     add    ecx,edx
  285.  
  286.     mov    ebx,[esi+edi]        ;center        (4x)
  287.     mov    edx,ebx
  288.     and    ebx,00ff00ffh
  289.     and    edx,0000ff00h
  290.     shl    ebx,2
  291.     shl    edx,2
  292.     add    eax,ebx
  293.     add    ecx,edx
  294.  
  295.     shr    eax,4
  296.     and    ecx,000ff000h
  297.     shr    ecx,4
  298.     and    eax,00ff00ffh
  299.     pop    edx
  300.     or    eax,ecx
  301.  
  302.     mov    [edx+ebp*4-4],eax
  303.     dec    ebp
  304.     jne    colloop2
  305.  
  306.     pop    ebp
  307.  
  308.     add    esi,edi
  309.     add    esi,edi
  310.     add    edx,[esp+24+28]
  311.  
  312.     dec    ebp
  313.     jne    rowloop2
  314.  
  315.     pop    eax
  316.     pop    ebx
  317.     pop    ecx
  318.     pop    edx
  319.     pop    esi
  320.     pop    edi
  321.     pop    ebp
  322.     ret
  323.  
  324. _asm_reduce2hq_run_MMX:
  325.     push    ebp
  326.     push    edi
  327.     push    esi
  328.     push    edx
  329.     push    ecx
  330.     push    ebx
  331.     push    eax
  332.  
  333.     mov    esi,[esp+ 8+28]
  334.     mov    edi,[esp+20+28]
  335.     mov    edx,[esp+ 4+28]
  336.  
  337.     mov    ebp,[esp+16+28]
  338.  
  339.     pxor    mm7,mm7
  340.  
  341. rowloop2_MMX:
  342.     push    ebp
  343.     push    esi
  344.     push    edx
  345.     mov    ebp,[esp+12+40]
  346. colloop2_MMX:
  347.     
  348.     ; middle center is 4x
  349.     ; top center, middle left, middle right, and bottom center are 2x
  350.     ; corners are 1x
  351.  
  352.     IF 0
  353.     movd    mm0,[esi]
  354.     movd    mm1,[esi+edi-4]
  355.     movd    mm2,[esi+edi+4]
  356.     movd    mm3,[esi+edi*2]
  357.     punpcklbw mm0,mm7
  358.     punpcklbw mm1,mm7
  359.     punpcklbw mm2,mm7
  360.     punpcklbw mm3,mm7
  361.     paddw    mm0,mm1
  362.     paddw    mm0,mm2
  363.     paddw    mm0,mm3
  364.     paddw    mm0,mm0
  365.  
  366.     movd    mm1,[esi-4]
  367.     movd    mm2,[esi+4]
  368.     movd    mm3,[esi+edi*2-4]
  369.     movd    mm4,[esi+edi*2+4]
  370.     punpcklbw mm1,mm7
  371.     punpcklbw mm2,mm7
  372.     punpcklbw mm3,mm7
  373.     punpcklbw mm4,mm7
  374.     paddw    mm0,mm1
  375.     paddw    mm0,mm2
  376.     paddw    mm0,mm3
  377.     paddw    mm0,mm4
  378.  
  379.     movd    mm1,[esi+edi]
  380.     punpcklbw mm1,mm7
  381.     psllw    mm1,2
  382.     paddw    mm0,mm1
  383.     psrlw    mm0,4
  384.     packuswb mm0,mm0
  385.     movd    [edx],mm0
  386.  
  387.     add    esi,8
  388.     add    edx,4
  389.  
  390.     dec    ebp
  391.     jne    colloop2_MMX
  392.  
  393.     ELSE
  394.  
  395.     movd    mm0,[esi]
  396.  
  397.     movd    mm1,[esi+edi-4]
  398.     punpcklbw mm0,mm7
  399.  
  400.     movd    mm2,[esi+edi+4]
  401.     punpcklbw mm1,mm7
  402.  
  403.     movd    mm3,[esi+edi*2]
  404.     punpcklbw mm2,mm7
  405.  
  406.     punpcklbw mm3,mm7
  407.     paddw    mm0,mm1
  408.  
  409.     movd    mm1,[esi-4]
  410.     paddw    mm0,mm2
  411.  
  412.     movd    mm2,[esi+4]
  413.     paddw    mm0,mm3
  414.  
  415.     movd    mm3,[esi+edi*2-4]
  416.     paddw    mm0,mm0
  417.  
  418.     movd    mm4,[esi+edi*2+4]
  419.     punpcklbw mm1,mm7
  420.  
  421.     punpcklbw mm2,mm7
  422.     paddw    mm0,mm2
  423.  
  424.     punpcklbw mm3,mm7
  425.     paddw    mm0,mm1
  426.  
  427.     movd    mm1,[esi+edi]
  428.     punpcklbw mm4,mm7
  429.  
  430.     punpcklbw mm1,mm7
  431.     paddw    mm0,mm3
  432.  
  433.     psllw    mm1,2
  434.     paddw    mm0,mm4
  435.  
  436.     paddw    mm0,mm1
  437.     add    esi,8
  438.  
  439.     psrlw    mm0,4
  440.     add    edx,4
  441.  
  442.     packuswb mm0,mm0
  443.     dec    ebp
  444.  
  445.     movd    [edx-4],mm0
  446.     jne    colloop2_MMX
  447.  
  448.     ENDIF
  449.  
  450.     pop    edx
  451.     pop    esi
  452.     pop    ebp
  453.  
  454.     add    esi,edi
  455.     add    esi,edi
  456.     add    edx,[esp+24+28]
  457.  
  458.     dec    ebp
  459.     jne    rowloop2_MMX
  460.  
  461.     pop    eax
  462.     pop    ebx
  463.     pop    ecx
  464.     pop    edx
  465.     pop    esi
  466.     pop    edi
  467.     pop    ebp
  468.     emms
  469.     ret
  470.  
  471.     end
  472.